﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

/*
模板方法模式：
在函数中确定好函数调用步骤，防止其他人调用错了。
例如：
	冲咖啡：
		1.煮水
		2.冲咖啡
		3.倒入杯中
		4.加糖和牛奶
	冲茶叶：
		1.煮水
		2.冲茶叶
		3.倒入杯中
		4.加柠檬 
*/

// 模板方法类 
class Drink {
public:
	// 煮水 
	virtual void Boil() = 0; 
	// 冲泡 
	virtual void Brew() = 0;
	// 倒入杯中 
	virtual void PourInCup() = 0;
	// 加点辅料 
	virtual void addSonm() = 0;
	// 模板方法 
	void func() {
		Boil();
		Brew();
		PourInCup();
		addSonm(); 
	}
};

class Coffee : public Drink {
public:
	// 煮水 
	virtual void Boil() {
		cout << "煮矿泉水" << endl;
	};
	// 冲泡 
	virtual void Brew() {
		cout << "冲泡拿铁" << endl;
	};
	// 倒入杯中 
	virtual void PourInCup() {
		cout << "倒入盆中" << endl;
	};
	// 加点辅料 
	virtual void addSonm() {
		cout << "加点大蒜" << endl;
	};
};

class Tea : public Drink {
public:
	// 煮水 
	virtual void Boil() {
		cout << "煮自来水" << endl;
	};
	// 冲泡 
	virtual void Brew() {
		cout << "冲泡铁观音" << endl;
	};
	// 倒入杯中 
	virtual void PourInCup() {
		cout << "倒入碗中" << endl;
	};
	// 加点辅料 
	virtual void addSonm() {
		cout << "加点酱油" << endl;
	};
};

void test01() {
	Drink *d = NULL;
	d = new Coffee;
	d->func();
	delete d;

	d = new Tea;
	d->func();
	delete d; 

}

int main()
{

	test01(); 

	system("pause");
	return EXIT_SUCCESS;
}